首页 > 试题广场 >

链表中倒数最后k个结点

[编程题]链表中倒数最后k个结点
  • 热度指数:358587 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。


数据范围:
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
示例1

输入

{1,2,3,4,5},2

输出

{4,5}

说明

返回倒数第2个节点4,系统会打印后面所有的节点来比较。 
示例2

输入

{2},8

输出

{}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param pHead ListNode类
 * @param k int整型
 * @return ListNode类
 */
function FindKthToTail( pHead ,  k ) {
    // write code here
    let count = 1;
    let node = pHead;
    let res = null;
    // 通过循环,给链表中的每个节点添加标志
    while(node){
        node.flag = count++;
        node = node.next;
    }
    // 如果链表中的节点计数小于截取长度,返回null
    if(count - 1 < k){
        return null;
    }else{
        // 通过顺序循环判断节点的flag值,如果等与需要截取的长度时,直接将该节点返回
        while(pHead){
            if(pHead.flag == count - k){
                res = pHead;
                return res;
            }
            pHead = pHead.next;
        }
    }
}
module.exports = {
    FindKthToTail : FindKthToTail
};
发表于 2023-06-20 16:57:20 回复(0)
// 巧用递归
let count = 0
function FindKthToTail( pHead ,  k ) {
    if(pHead == null || k == 0) return null
    count++
    if(pHead.next == null) return count >= k ? 1 : null
    let res = FindKthToTail(pHead.next , k)
    if(typeof res == 'number'){
        return res + 1 == k ? pHead : res + 1
    }else{
        return res
    }
}

发表于 2022-10-20 15:31:31 回复(0)
/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param pHead ListNode类
 * @param k int整型
 * @return ListNode类
 */
function FindKthToTail(pHead, k) {
    // write code here
    let p1 = pHead
    let p2 = pHead
    for (let i = 0; i < k; i++) {
        if (p2 == null) {
            return null //直接返回null
        }
        p2 = p2.next
    }
    while (p2 != null) {
        p2 = p2.next
        p1 = p1.next
    }
    return p1
}

module.exports = {
    FindKthToTail: FindKthToTail
};

发表于 2022-09-03 08:45:43 回复(0)
function FindKthToTail( pHead ,  k ) {
    if(!pHead) return null;
    let count = 0,cur= pHead,prev=null;
    while(cur){
        count++;
        cur.prev = prev;
        prev = cur;
        cur = cur.next;
    }
    if(k>count || k<=0) return null;
    while(--k>0){
        prev = prev.prev;
    }
    return prev;
}

发表于 2022-08-28 13:45:19 回复(0)
简介的JavaScript:
function FindKthToTail( pHead ,  k ) {
    // write code here    
    if (pHead === null || k === 0) return null;
    
    let node = pHead;
    for(let i = 1; i < k; i++){
        pHead = pHead.next;
        if (pHead === null) return null;
    }
    
    while (pHead.next){
        node = node.next;
        pHead = pHead.next;
    }
    
    return node;
}


发表于 2021-09-29 03:32:05 回复(2)
function FindKthToTail( pHead ,  k ) {
    // write code here
    if(pHead === null) return 0
    let n1 = pHead, n2 = pHead,len=0
    // 额外的一个指针, 目的用来计算链表长度
    let temp = pHead,count = 0
    while(temp){
        count++
        temp = temp.next
    }
    if(count < k){
        return 0
    }
    
    // n2 先走k步
    for(let i=0;i<k;i++){
        if(n2 !==null){
            n2 = n2.next
        }
    }
    // 当n2为空时,n1所指的位置即为所求
    while(n2 !== null){
        n1 = n1.next
        n2 = n2.next
    }
    return n1
}
module.exports = {
    FindKthToTail : FindKthToTail
};

发表于 2021-09-22 16:15:00 回复(0)

问题信息

上传者:灵溪吴彦祖
难度:
7条回答 5801浏览

热门推荐

通过挑战的用户

查看代码